//////////////////////////////////////////////////////////////////////////
#pragma once


namespace Math
{
	//////////////////////////////////////////////////////////////////////////
	inline Point2i::Point2i()
	{
	}


	inline Point2i::Point2i( const Point2i& rhs )
	:	mX( rhs.mX )
	,	mY( rhs.mY )
	{
	}


	inline Point2i::Point2i( int32_t x, int32_t y )
	:	mX( x )
	,	mY( y )
	{
	}


	//////////////////////////////////////////////////////////////////////////
	inline int32_t Point2i::X() const
	{
		return mX;
	}


	inline int32_t Point2i::Y() const
	{
		return mY;
	}


	inline void Point2i::X( int32_t x )
	{
		mX = x;
	}


	inline void Point2i::Y( int32_t y )
	{
		mY = y;
	}


	//////////////////////////////////////////////////////////////////////////
	inline int32_t Point2i::operator ()( size_t idx ) const
	{
		assert( idx <= 2 );
		return (&mX)[ idx ];
	}


	inline void Point2i::operator ()( size_t idx, int32_t v )
	{
		assert( idx <= 2 );
		(&mX)[ idx ] = v;
	}


	//////////////////////////////////////////////////////////////////////////
	inline void Point2i::Set( int32_t x, int32_t y )
	{
		mX	=	x;
		mY	=	y;
	}


	inline const Point2i& Point2i::operator =( const Point2i& rhs )
	{
		mX	=	rhs.mX;
		mY	=	rhs.mY;
		return *this;
	}


	//////////////////////////////////////////////////////////////////////////
	inline Point2i Point2i::operator -() const							{return Point2i( -mX, -mY );}
	inline Point2i Point2i::operator -( const Point2i& rhs ) const		{return Point2i( mX-rhs.mX, mY-rhs.mY );}
	inline Point2i Point2i::operator +( const Point2i& rhs ) const		{return Point2i( mX+rhs.mX, mY+rhs.mY );}
	inline void Point2i::operator -=( const Point2i& rhs )
	{
		mX	-=	rhs.mX;
		mY	-=	rhs.mY;
	}
	inline void Point2i::operator +=( const Point2i& rhs )
	{
		mX	+=	rhs.mX;
		mY	+=	rhs.mY;
	}


	//////////////////////////////////////////////////////////////////////////
	inline bool Point2i::IsValid() const
	{
		return (mX*0.0f)==0.0f	&&	(mY*0.0f)==0.0f;
	}


	//////////////////////////////////////////////////////////////////////////
	inline const Point2i Point2i::Zero()										{return Point2i( 0, 0 );}
	inline const Point2i Point2i::XAxis()										{return Point2i( 1, 0 );}
	inline const Point2i Point2i::YAxis()										{return Point2i( 0, 1 );}


	//////////////////////////////////////////////////////////////////////////
	inline Point2i					Multiply( const Point2i& lhs, const Point2i& rhs )
	{
		return Point2i(
			lhs.X() * rhs.X(),
			lhs.Y() * rhs.Y()	);
	}
}
